#include <functional>
#include <thread>
#include <vector>
#include <memory>
#include <cstring>

namespace os
{
    namespace v2x
    {
        namespace device
        {
            typedef std::function<void(const u_char *, int32_t, int32_t)> DataParsedCallback;

            class RxbitParser
            {
            public:
                RxbitParser(DataParsedCallback cb) : msgUpdate(cb)
                {

                }

                // virtual ~RxbitParser() = default;

                // void Init(std::function<void(const u_char *, int32_t ,int32_t)> msgParsed)
                // {
                //     msgUpdate = std::move(msgParsed);
                // }

                void Invoke(const u_char *data, int32_t size);

                int32_t FD = {0};

            private:
                /// <summary>
                /// 数据缓存（用于解析包格式）
                /// </summary>
                u_char parser_buffer[(256 * 48 + 26 + 45) * 3];
                /// <summary>
                /// 数据缓存的位置
                /// </summary>
                int32_t parser_buffer_location = 0;
                /// <summary>
                /// 数据缓存的有效长度
                /// </summary>
                int32_t parser_buffer_valid_count = 0;

                void Format();

                const uint32_t PACKAGE_HEADER_VALUE = 0x5A5A5A5A;
                const uint32_t PACKAGE_TAILER_VALUE = 0xA5A5A5A5;

                // 最小包长度
                const int PACKAGE_MIN_LEN = 45; // 37+8
                
                DataParsedCallback msgUpdate;
            };

        } // namespace device
    }     // namespace v2x
} // namespace os
